package br.com.cinesystem.control;

import br.com.cinesystem.entity.Ator;
import br.com.cinesystem.entity.Filme;
import br.com.cinesystem.entity.Genero;
import br.com.cinesystem.entity.Usuario;
import br.com.cinesystem.persistence.AtorDao;
import br.com.cinesystem.persistence.CinemaDao;
import br.com.cinesystem.persistence.FilmeDao;
import br.com.cinesystem.persistence.GeneroDao;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItem;



public class ManterFilme extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=ISO-8859-1");
        

        String cmd = request.getParameter("cmd");
        PrintWriter out = response.getWriter();
            if (cmd != null){

                if (cmd.equals("cadastrar")){

                    FilmeDao fd = null;
                    AtorDao ad = null;

                    String destino = "filme.do?cmd=home";

                    
                    try{

                        fd = new FilmeDao();
                        ad = new AtorDao();

                        if(request.getParameter("titulo").isEmpty()){

                            destino = "filme.do?cmd=form";
                            throw new Exception("Título é um campo obrigatório!");

                        }else{

                            if(request.getParameter("diretor").isEmpty()){

                                destino = "filme.do?cmd=form";
                                throw new Exception("Diretor é um campo obrigatório!");

                            }else{

                                if(request.getParameter("genero").isEmpty()){

                                    destino = "filme.do?cmd=form";
                                    throw new Exception("Genero é um campo obrigatório!");

                                }else{

                                    if(request.getParameter("duracao").isEmpty()){

                                        destino = "filme.do?cmd=form";
                                        throw new Exception("Duração é um campo obrigatório!");

                                    }else{

                                        if(request.getParameter("idioma").isEmpty()){

                                            destino = "filme.do?cmd=form";
                                            throw new Exception("Idioma é um campo obrigatório!");

                                        }else{


                                            if(request.getParameter("classificacao").isEmpty()){

                                                destino = "filme.do?cmd=form";
                                                throw new Exception("Classificação é um campo obrigatório!");

                                            }else{

                                                if(request.getParameter("sinopse").isEmpty()){

                                                    destino = "filme.do?cmd=form";
                                                    throw new Exception("Sinopse é um campo obrigatório!");

                                                }else{

                                                    Filme f = new Filme();

                                                    f.setGenero(new Genero());

                                                    String duracao = request.getParameter("duracao");

                                                    Pattern p = Pattern.compile("[0-9]{"+duracao.length()+"}");

                                                    Matcher m = p.matcher(duracao);

                                                    if(m.matches()){

                                                        f.setDuracao(Integer.parseInt(duracao));

                                                    }else{

                                                        throw new Exception("*Digite somente números no campo Duração!");

                                                    }
                                                    
                                                    f.setTitulo(request.getParameter("titulo"));
                                                    f.setDiretor(request.getParameter("diretor"));
                                                    f.getGenero().setIdGenero(Integer.parseInt(request.getParameter("genero")));
                                                    f.setIdioma(request.getParameter("idioma"));
                                                    f.setSinopse(request.getParameter("sinopse"));
                                                    f.setClassificacao(request.getParameter("classificacao"));
                                                    
                                                    Filme fr = fd.salvar(f);

                                                    String[] atores = request.getParameterValues("atores");
                                                                                                        
                                                    List<String> list = Arrays.asList(atores);

                                                    for(int i = 0; i < list.size(); i++){

                                                        Ator ator = new Ator();

                                                        ator.setNome(list.get(i));

                                                        if(ad.verificarAtor(ator)!=null){

                                                            Ator ator2 = ad.verificarAtor(ator);
                                                            fd.salvarAtorFilme(fr, ator2);

                                                        }else{

                                                            Ator ator2 = ad.salvar(ator);
                                                            fd.salvarAtorFilme(fr, ator2);

                                                        }
                                                        
                                                    }
                                                    HttpSession session = request.getSession(true);

                                                    Usuario us = (Usuario) request.getSession().getAttribute("sessao");

                                                    if(us!=null){

                                                        if(us.getPerfil().equals(1)){
                                                            destino = "filme.do?cmd=home";
                                                        }
                                                        if(us.getPerfil().equals(2)){
                                                            destino = "filme.do?cmd=listar";
                                                        }
                                                        if(us.getPerfil().equals(3)){
                                                            destino = "filme.do?cmd=listar";
                                                        }

                                                    }
                                                    
                                                    request.setAttribute("mensagem", "Filme cadastrado com sucesso.");
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);
                    }

                }

                if (cmd.equals("alterar")){

                    FilmeDao fd = null;
                    AtorDao ad = null;

                    String destino = "filme.do?cmd=buscar&id="+request.getParameter("id");

                    try{

                        fd = new FilmeDao();
                        ad = new AtorDao();

                        if(request.getParameter("titulo").isEmpty()){

                            destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                            throw new Exception("Título é um campo obrigatório!");

                        }else{

                            if(request.getParameter("diretor").isEmpty()){

                                destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                                throw new Exception("Diretor é um campo obrigatório!");

                            }else{

                                if(request.getParameter("genero").isEmpty()){

                                    destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                                    throw new Exception("Genero é um campo obrigatório!");

                                }else{

                                    if(request.getParameter("duracao").isEmpty()){

                                        destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                                        throw new Exception("Duração é um campo obrigatório!");

                                    }else{

                                        if(request.getParameter("idioma").isEmpty()){

                                            destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                                            throw new Exception("Idioma é um campo obrigatório!");

                                        }else{


                                            if(request.getParameter("classificacao").isEmpty()){

                                                destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                                                throw new Exception("Classificação é um campo obrigatório!");

                                            }else{

                                                if(request.getParameter("sinopse").isEmpty()){

                                                    destino = "filme.do?cmd=buscar&id="+request.getParameter("id");
                                                    throw new Exception("Sinopse é um campo obrigatório!");

                                                }else{

                                                    Filme f = new Filme();

                                                    f.setGenero(new Genero());

                                                    String duracao = request.getParameter("duracao");

                                                    Pattern p = Pattern.compile("[0-9]{"+duracao.length()+"}");

                                                    Matcher m = p.matcher(duracao);

                                                    if(m.matches()){

                                                        f.setDuracao(Integer.parseInt(duracao));

                                                    }else{

                                                        throw new Exception("*Digite somente números no campo Duração!");

                                                    }

                                                    f.setTitulo(request.getParameter("titulo"));
                                                    f.setDiretor(request.getParameter("diretor"));
                                                    f.getGenero().setIdGenero(Integer.parseInt(request.getParameter("genero")));
                                                    f.setIdioma(request.getParameter("idioma"));
                                                    f.setSinopse(request.getParameter("sinopse"));
                                                    f.setClassificacao(request.getParameter("classificacao"));
                                                    f.setIdFilme(Integer.parseInt(request.getParameter("id")));

                                                    fd.alterar(f);

                                                    String[] atores = request.getParameterValues("atores");

                                                    List<String> list = Arrays.asList(atores);

                                                    fd.excluirAtorFilme(f);

                                                    Ator ator = null;

                                                    for(int i = 0; i < list.size(); i++){

                                                        ator = new Ator();

                                                        ator.setNome(list.get(i));

                                                        if(ad.verificarAtor(ator)!=null){

                                                            Ator ator2 = ad.verificarAtor(ator);
                                                            fd.salvarAtorFilme(f, ator2);

                                                        }else{

                                                            Ator ator2 = ad.salvar(ator);
                                                            fd.salvarAtorFilme(f, ator2);

                                                        }
                                                    }
                                                    HttpSession session = request.getSession(true);

                                                    Usuario us = (Usuario) request.getSession().getAttribute("sessao");

                                                    if(us!=null){

                                                        if(us.getPerfil().equals(1)){
                                                            destino = "filme.do?cmd=home";
                                                        }
                                                        if(us.getPerfil().equals(2)){
                                                            destino = "filme.do?cmd=listar";
                                                        }
                                                        if(us.getPerfil().equals(3)){
                                                            destino = "filme.do?cmd=listar";
                                                        }

                                                    }
                                                    
                                                    request.setAttribute("mensagem", "Filme alterado com sucesso.");
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

                }

                if (cmd.equals("home")){

                    FilmeDao fd = new FilmeDao();

                    HttpSession session = request.getSession(true);

                    Usuario u = (Usuario) request.getSession().getAttribute("sessao");
                    Integer num = 1;

                    String destino = "home.jsp";
                    request.setAttribute("titulo", "Filmes em Cartaz");
                    request.setAttribute("flag", num);

                    try{

                        if(u!=null){

                            if(u.getPerfil()==1){
                               destino = "cliente/home.jsp";
                            }else if(u.getPerfil()==2){
                               destino = "funcionario/home.jsp";
                            }else if(u.getPerfil()==3){
                               destino = "admin/home.jsp";
                            }

                        }
                        
                        request.setAttribute("filmes", fd.buscarTodosEmCartaz());

                    }catch(Exception e){

                        request.setAttribute("mensagem", e.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

                }
                if (cmd.equals("proximos")){

                    FilmeDao fd = new FilmeDao();

                    HttpSession session = request.getSession(true);

                    Usuario u = (Usuario) request.getSession().getAttribute("sessao");
                    Integer num = 2;

                    String destino = "home.jsp";
                    request.setAttribute("titulo", "Próximos Lançamentos");
                    request.setAttribute("flag", num);

                    try{

                        if(u!=null){

                            if(u.getPerfil()==1){
                               destino = "cliente/home.jsp";
                            }else if(u.getPerfil()==2){
                               destino = "funcionario/home.jsp";
                            }else if(u.getPerfil()==3){
                               destino = "admin/home.jsp";
                            }

                        }

                        request.setAttribute("filmes", fd.buscarProximosLanc());

                    }catch(Exception e){

                        request.setAttribute("mensagem", e.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

                }
                if (cmd.equals("excluir")){

                    FilmeDao fd = null;

                    HttpSession session = request.getSession(true);

                    Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                    String destino = "home.jsp";

                    if(u!=null){
                        if(u.getPerfil()==1){
                           destino = "cliente/home.jsp";
                        }else if(u.getPerfil()==2){
                           destino = "filme.do?cmd=listar";
                        }else if(u.getPerfil()==3){
                           destino = "filme.do?cmd=listar";
                        }
                    }

                    try{

                        fd = new FilmeDao();

                        Filme f = new Filme();

                        f.setIdFilme(Integer.parseInt(request.getParameter("id")));

                        fd.excluir(f);

                        request.setAttribute("mensagem", "Filme desativado com sucesso.");

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

                }

                if (cmd.equals("listar")){

                    FilmeDao fd = null;
                    String destino = "home.jsp";

                    HttpSession session = request.getSession(true);

                    Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                    if(u!=null){
                        if(u.getPerfil()==1){
                           destino = "cliente/home.jsp";
                        }else if(u.getPerfil()==2){
                           destino = "funcionario/filme.jsp";
                        }else if(u.getPerfil()==3){
                           destino = "admin/filme.jsp";
                        }
                    }
                    try{

                        fd = new FilmeDao();

                        List<Filme> lista = fd.buscarTodos();

                        request.setAttribute("filmes", lista);

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

                }


                if(cmd.equals("buscar")){

                    FilmeDao fd = new FilmeDao();
                    AtorDao ad = new AtorDao();
                    GeneroDao gd = new GeneroDao();

                    String destino = "filme.do?cmd=listar";
                    
                    HttpSession session = request.getSession(true);
                    Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                    if(u!=null){
                        if(u.getPerfil()==1){
                           destino = "filme.do?cmd=home";
                        }else if(u.getPerfil()==2){
                           destino = "funcionario/alterar_filme.jsp";
                        }else if(u.getPerfil()==3){
                           destino = "admin/alterar_filme.jsp";
                        }
                    }

                    try{

                        Filme filme = new Filme();

                        filme.setIdFilme(Integer.parseInt(request.getParameter("id")));

                        if(u!=null){

                            Filme f = fd.buscar(filme);

                            Filme filme2 = fd.buscarAtorFilme(f);

                            f.setAtorList(filme2.getAtorList());

                            request.setAttribute("filme", f);
                            request.setAttribute("generos", gd.BuscarTodosGeneros());

                        }else{

                            throw new Exception("*Você deve estar logado e ter permissão para essa operação!");

                        }

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

            }

            if(cmd.equals("verCinema")){

                    FilmeDao fd = new FilmeDao();
                    AtorDao ad = new AtorDao();
                    GeneroDao gd = new GeneroDao();
                    CinemaDao cd = new CinemaDao();

                    String destino = "home.jsp";


                    try{

                        HttpSession session = request.getSession(true);

                        Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                        Filme filme = new Filme();

                        filme.setIdFilme(Integer.parseInt(request.getParameter("id")));

                        Filme f = fd.buscar(filme);

                        Filme filme2 = fd.buscarAtorFilme(f);

                        f.setAtorList(filme2.getAtorList());
                        f.setCinemaList(fd.buscarCinema(f));

                        request.setAttribute("filme", f);


                        if(u!=null){

                            if(u.getPerfil()==1){
                                destino = "cliente/filme_cinemas.jsp";
                            }else if(u.getPerfil()==2){
                                destino = "funcionario/filme_cinemas.jsp";
                            }else if(u.getPerfil()==3){
                                destino = "admin/filme_cinemas.jsp";
                            }

                        }else{

                            destino = "filme_cinemas.jsp";

                        }

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

            }

            if(cmd.equals("form")){

                    GeneroDao gd = null;
                    String destino = "filme.do?cmd=listar";

                    try{

                        HttpSession session = request.getSession(true);

                        gd = new GeneroDao();

                        Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                        if(u!=null){

                            if(u.getPerfil()==1){
                                destino = "filme.do?cmd=home";
                            }else if(u.getPerfil()==2){
                                destino = "funcionario/cadastro_filme.jsp";
                            }else if(u.getPerfil()==3){
                                destino = "admin/cadastro_filme.jsp";
                            }

                            List<Genero> lista = gd.BuscarTodosGeneros();

                            request.setAttribute("generos", lista);

                        }else{

                            throw new Exception("*Você deve estar logado e ter permissão para esta operação!");

                        }

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

            }

                if (cmd.equals("formImagem")){

                    FilmeDao fd = null;

                    String destino = "filme.do?cmd=listar";

                    HttpSession session = request.getSession(true);
                    Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                    if(u!=null){
                        if(u.getPerfil()==1){
                           destino = "filme.do?cmd=home";
                        }else if(u.getPerfil()==2){
                           destino = "funcionario/enviar_imagem.jsp";
                        }else if(u.getPerfil()==3){
                           destino = "admin/enviar_imagem.jsp";
                        }
                    }
                    try{

                        fd = new FilmeDao();

                        Filme filme = new Filme();
                        filme.setIdFilme(Integer.parseInt(request.getParameter("id")));

                        request.setAttribute("filme", filme);

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

                }

                if (cmd.equals("inserirImagem")){

                    
                    String destino = "filme.do?cmd=listar";

                    
                    boolean isMultipart = FileUpload.isMultipartContent(request);

                    if(isMultipart){

                        FileItemFactory factory = new DiskFileItemFactory();
                        ServletFileUpload upload = new ServletFileUpload(factory);

                        String parametro=null;
                        File f=null;

                        try{
                            //cria uma lista de items e percorre a lista
                            List items = upload.parseRequest(request);
                            Iterator iter = items.iterator();

                            while(iter.hasNext()){
                                FileItem item = (FileItem)iter.next();

                                //pega os dados do arquivo, nome, tipo, tamanho ....
                                String caminho = item.getName(); //em alguns browsers só retorna o nome do arquivo
                                out.print(caminho);
                                String tipo = item.getContentType();
                                long tamanho = item.getSize();

                                //converte byte para megabyte
                                long megabyte = 1024L * 1024L;
                                double tamanhoEmMegabyte = (double) tamanho / megabyte;
                                //formata o valor do megabyte
                                NumberFormat nf = NumberFormat.getInstance();
                                nf.setMinimumFractionDigits(2);
                                nf.setMaximumFractionDigits(2);

                                //processa os campos normais do form
                                if(item.isFormField()){

                                    //busca dados de um campo com o nome teste (aqui, um input de texto no formulario .jsp)
                                    if(item.getFieldName().equals("id")){
                                        //pega o valor em String do campo teste e passa para o parametro
                                        parametro = item.getString();
                                    }

                                }

                                //processa os arquivo de upload
                                if(!item.isFormField()){

                                    //pega somente o nome do arquivo - isso pq alguns browsers passam o path completo no item.getName(), o que vai gerar erro
                                    String nome = item.getName();
                                    String arq[] = nome.split("\\\\");
                                    for(int i=0; i<arq.length; i++){
                                        nome = arq[i];
                                    }

                                    String diretorio = "C:/Users/DELL/Documents/NetBeansProjects/ProjetoCinema/web/statics/images/capas/" + parametro + ".jpg";
                                    //String diretorio = "C:/Users/Sidiney/Documents/NetBeansProjects/ProjetoCinema/web/statics/images/capas/" + parametro + ".jpg";
                                    //String diretorio ="e:/inetpub/vhosts/cinesystem.net/httpdocs/capas/" + parametro + ".jpg";
                                    //cria o arquivo no diretório raiz do projeto
                                    f = new File(diretorio);
                                    //grava o arquivo
                                    item.write(f);
                                    //out.println("<b><br>Caminho:</b> " + caminho+"<i> (alguns browsers passam só o nome do arquivo)</i>");
                                    //out.println("<b><br>Só o nome do arquivo:</b> " + nome);
                                    //out.println("<br/><b>Tipo:</b> " + tipo);
                                    //out.println("<br/><b>Tamanho:</b> " + nf.format(tamanhoEmMegabyte)+" MB");
                                    //out.println("<b><br>Salvo em:</b> " + diretorio);
                                }

                            }

                            //Demais métodos do servlet
                            //out.print("<br/><b>Parametro 1:</b> "+parametro);
                            //f.delete();


                            request.setAttribute("mensagem", "*Arquivo Enviado com sucesso!");

                            destino = "filme.do?cmd=listar";

                        }catch(Exception ex){
                            System.out.println("Erro: "+ex.getMessage());
                        }finally{

                            request.getRequestDispatcher(destino).forward(request, response);

                        }


                    }


                }

        }


    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);

        
    } 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);


    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
